package main

import "fmt"

// 定义一个父类结构体
type Person01 struct {
	name string
	age  int
}

// 定义一个子类结构体
type Student struct {
	Person01        // 匿名变量，继承
	school   string // 子类自己的属性字段
}

func main() {

	p1 := Person01{name: "sali", age: 18}
	fmt.Println(p1.name)

	s1 := Student{Person01{name: "sali01", age: 20}, "school01"}
	fmt.Println(s1.Person01.name)

	/*
		提升字段
		对于Student来说，Person是匿名字段，Person中的属性name、age就叫做提升字段
		提升字段可以通过名字直接访问，不需要再通过结构体名Person
	*/
	/*
		1. 模拟继承性
		type A struct {
			field
		}
		type B struct {
			A // 匿名字段
		}
		// b就可以直接访问a中的属性


		2. 模拟聚合性
		type C struct {
			field
		}
		type D struct {
			c C // 聚合关系
		}
		// d不能直接访问c当中的属性，需要通过d.C.xx访问
	*/
	var s3 Student
	s3.name = "sali02"
	s3.school = "school02"
	fmt.Println(s3.name, s3.school)
}
